#include <stdio.h>
#ifdef WIN32
#include <curses.h>
#else
#include <ncurses.h>
#endif

#include <assert.h>
#include <time.h>
#include "jeu.h"

void ncursAff( WINDOW* win, const jeu* j)
{
	int x,y,i_ennemis;

	const terrain* t = jeuGetConstTerrain(j);
	const personnage* p = jeuGetConstPersonnage(j);
    const balle* b = jeuGetConstBalle(j);

	wclear(win);

	for(x=0;x<getDimX(&(j->t));x++) //Affichage du terrain
    {
        for(y=0;y<getDimY(&(j->t));y++)
        {
            mvwprintw( win, y, x, "%c", getTer (x, y , t) );
        }
    }

    for (i_ennemis=0; i_ennemis<j->te.nbEnnemis; i_ennemis++) // Affichage des ennemis
        mvwprintw( win, j->te.tabEnnemis[i_ennemis].posY, j->te.tabEnnemis[i_ennemis].posX, "+");

	mvwprintw( win, PgetPosY(p), PgetPosX(p), "0");

	wmove( win, PgetPosY(p), PgetPosX(p));

	mvwprintw(win , BgetPosY(b), BgetPosX(b), "6");




}

void ncursBoucle(jeu* j)
{
	WINDOW *win, *screen;
	int c;
	int boucleContinue;

	 /* Horloges (en secondes) */
    float horloge_courante, horloge_precedente;

    /* Intervalle de temps (en secondes) entre deux évolutions du jeu */
    /* Changer la valeur pour ralentir ou accélérer le déplacement des ennemis */
    float intervalle_horloge = 0.4f;

	screen = initscr();		/* passe l'écran texte en mode NCurses */
	clear();		/* efface l'écran */
	noecho();  	/* Lorsqu'une touche est préssée au clavier, elle n'apparait pasa à l'écran */
	cbreak();		/* un caractère est directement affiché, il ne passe pas dans un buffer */

	/* Creation d'une nouvelle fenetre en mode texte */
	/* => fenetre de dimension et position ( WIDTH, HEIGHT, STARTX,STARTY) */
	win = newwin( getDimY(jeuGetConstTerrain(j)), getDimX(jeuGetConstTerrain(j)), 5, 5 );
	keypad(win, TRUE);		/* pour que les flèches soient traitées (il faut le faire après création de la fenêtre) */

	/*halfdelay(temps_dizieme);*/
	/* notimeout(win,true); */
	/* wtimeout( win, 500 ); */
	nodelay(win,true); /* Pour que l'appel à wgetch soit non-bloquant */

	boucleContinue = 1;

	/* Récupère l'horloge actuelle et la convertit en secondes */
    /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
    horloge_precedente = (float)clock()/(float)CLOCKS_PER_SEC;

    ncursAff( win, j);

	do
	{
        /* Récupère l'horloge actuelle et la convertit en secondes */
        /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
        horloge_courante = (float)clock()/(float)CLOCKS_PER_SEC;

        if (horloge_courante-horloge_precedente>=intervalle_horloge)
        {
            jeuDeplacementennemis(j);
            collision(j);
            if(j->b.portee>0)
            {
                tir(j);
            }

            boucleContinue=testFinJeu(j);
            ncursAff( win, j);
            horloge_precedente = horloge_courante;
        }


		c = wgetch(win);
		/* jeuActionClavier( jeu, 'd'); */
		switch(c)
		{
			case KEY_LEFT:
				jeuActionClavier( j, 'g');
				ncursAff( win, j);
				break;
			case KEY_RIGHT:
				jeuActionClavier( j, 'd');
				ncursAff( win, j);
				break;
			case KEY_UP:
				jeuActionClavier( j, 'h');
				ncursAff( win, j);
				break;
			case KEY_DOWN:
				jeuActionClavier( j, 'b');
				ncursAff( win, j);
				break;
			case 27: /* ECHAP */
				boucleContinue = 0;
				break;
            case ' ':
                jeuActionClavier(j, 't');
                break;
		}


	} while (boucleContinue==1);

    assert(delwin(win)!=ERR);
    assert(delwin(screen)!=ERR);

	endwin();
}
